﻿using QFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace PlatformShoot
{
    public interface ICameraSystem : ISystem
    {
        void SetTarget(Transform target);
        //void Update();
    }
    public class CameraSystem : AbstractSystem,ICameraSystem
    {
        private Transform mTarget;

        private Vector3 mTempPos;

        private float minX = -100f, minY = -100f, maxX = 100f, maxY = 100f;
        private float mSmoothSpeed = 5f;
        protected override void OnInit()
        {
            // 初始化就注册好帧更新
            PublicMono.Instance.OnLateUpdate += Update;
            // 2D平台坐标中，保持摄像机在纵轴的固定距离，此处设置为-10
            mTempPos.z = -10;
        }

        void ICameraSystem.SetTarget(Transform target)
        {
            // 之前因为没有Mono单例，所以需要对帧更新进行注册
            mTarget = target;

        }

        private void Update()
        {
            if (mTarget == null) return;
            // 对摄像机的xy进行计算，并使用Clamp函数对其做出限制
            mTempPos.x = Mathf.Clamp(mTarget.position.x, minX, maxX);
            mTempPos.y = Mathf.Clamp(mTarget.position.y, minY, maxY);
            // 给摄像机赋值， 使用lerp函数可以让其运动轨迹有缓入缓出的的效果
            var cam = Camera.main.transform;
            // 通过计算两点的坐标之间的模长，即两点间距离，若小于0.01就停止对摄像机坐标的赋值
            if ((cam.position - mTempPos).sqrMagnitude < 0.01f) return;
            // 填入一个插值速度，给一个变量进行管理，因为lerp的算法的特点，需要对最小值进行一个限制
            cam.localPosition = Vector3.Lerp(cam.position, mTempPos, mSmoothSpeed);
            //Camera.main.transform.localPosition = new Vector3(mTarget.position.x, mTarget.position.y, -10);
        }
    }
}
